home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML Instance.sea / XML Instance / Required / plugins / HTMLWindow.jar / horst / ViewLine.class (.txt) < prev   
Encoding:
Java Class File  |  2000-03-18  |  5.3 KB  |  238 lines

  1. package horst;
  2.  
  3. import java.awt.Rectangle;
  4. import java.util.Vector;
  5.  
  6. public class ViewLine {
  7.    Vector vector = new Vector();
  8.    // $FF: renamed from: x int
  9.    int field_0;
  10.    // $FF: renamed from: y int
  11.    int field_1;
  12.    int alignment = 0;
  13.    int descent = 0;
  14.    int lineWidth;
  15.    int height;
  16.    Rectangle bounds;
  17.    int xOffset;
  18.    int renderedWidth;
  19.    int savedTargetWidth;
  20.    View parent;
  21.  
  22.    ViewLine() {
  23.    }
  24.  
  25.    void addView(View v) {
  26.       this.vector.addElement(v);
  27.    }
  28.  
  29.    void alignmentAdjust() {
  30.       if (this.alignment == 1) {
  31.          int availSpace = this.savedTargetWidth - this.renderedWidth;
  32.          if (availSpace > 0) {
  33.             this.move(availSpace / 2, 0, true);
  34.          }
  35.  
  36.          this.bounds.width = this.savedTargetWidth;
  37.       } else if (this.alignment == 2) {
  38.          int availSpace = this.savedTargetWidth - this.renderedWidth;
  39.          if (availSpace > 0) {
  40.             this.move(availSpace, 0, true);
  41.          }
  42.  
  43.          this.bounds.width = this.savedTargetWidth;
  44.       }
  45.  
  46.    }
  47.  
  48.    int findNBSPBreak() {
  49.       int sz = this.vector.size();
  50.  
  51.       for(int i = sz - 1; i >= 0; --i) {
  52.          View v = (View)this.vector.elementAt(i);
  53.          if (v.getElementType() == 101) {
  54.             int idx = i - 2;
  55.             if (idx < 0) {
  56.                break;
  57.             }
  58.  
  59.             View potentialView = (View)this.vector.elementAt(idx);
  60.             if (potentialView.getElementType() != 101) {
  61.                return idx;
  62.             }
  63.          }
  64.       }
  65.  
  66.       return -1;
  67.    }
  68.  
  69.    View getLastView() {
  70.       int sz = this.vector.size();
  71.       return sz > 0 ? (View)this.vector.elementAt(sz - 1) : null;
  72.    }
  73.  
  74.    int getLastView(int type) {
  75.       int sz = this.vector.size();
  76.  
  77.       for(int i = sz - 1; i >= 0; --i) {
  78.          View v = (View)this.vector.elementAt(i);
  79.          if (v.getElementType() == 101) {
  80.             return i;
  81.          }
  82.       }
  83.  
  84.       return -1;
  85.    }
  86.  
  87.    View[] getViews() {
  88.       View[] data = new View[this.vector.size()];
  89.       this.vector.copyInto(data);
  90.       return data;
  91.    }
  92.  
  93.    boolean isEmpty() {
  94.       return this.vector.size() == 0;
  95.    }
  96.  
  97.    Rectangle layout(int parentWidth, int targetWidth, LayoutInfo info) {
  98.       int xPos = this.field_0;
  99.       int yPos = this.field_1;
  100.       int rowHeight = 0;
  101.       this.renderedWidth = 0;
  102.       this.savedTargetWidth = targetWidth;
  103.       int maxDescent = 0;
  104.       int maxAboveBaseline = 0;
  105.       View[] views = this.getViews();
  106.       int nViews = views.length;
  107.       int marginEnd = this.field_0 + info.leftMargin;
  108.       this.xOffset = 0;
  109.       if (views.length == 1 && views[0] instanceof BRView) {
  110.          int width = 0;
  111.          this.height = ((BRView)views[0]).getBreakHeight();
  112.          this.bounds = new Rectangle(this.field_0, this.field_1, width, rowHeight);
  113.          views[0].layout(this.field_0, this.field_1, width, info);
  114.          return this.bounds;
  115.       } else {
  116.          for(int i = 0; i < views.length; ++i) {
  117.             View v = views[i];
  118.             Rectangle bounds = null;
  119.             boolean bContainerView = v.isContainerView();
  120.             if (!v.isWrappable() && xPos < marginEnd) {
  121.                this.xOffset = marginEnd;
  122.                xPos = this.xOffset;
  123.                this.field_0 = xPos;
  124.             }
  125.  
  126.             bounds = v.layout(xPos, yPos, parentWidth, info);
  127.             xPos += bounds.width;
  128.             this.renderedWidth += bounds.width;
  129.             maxDescent = Math.max(maxDescent, v.getDescent());
  130.             int aboveBaseline = bounds.height;
  131.             maxAboveBaseline = Math.max(maxAboveBaseline, aboveBaseline);
  132.          }
  133.  
  134.          if (views.length > 1) {
  135.             for(int i = 0; i < views.length; ++i) {
  136.                View v = views[i];
  137.                int yAdjustment = maxAboveBaseline - v.getBounds().height;
  138.                if (yAdjustment > 0) {
  139.                   v.move(0, yAdjustment, true);
  140.                }
  141.             }
  142.          }
  143.  
  144.          if (info.bPaginate) {
  145.             boolean bPageAdjustmentOccurred = false;
  146.  
  147.             for(int i = 0; i < views.length; ++i) {
  148.                if (!views[i].isContainerView() && views[i].m_bounds.intersects(info.pageBreak)) {
  149.                   int yOffset = info.pageBreak.y + info.pageBreak.height - views[i].m_bounds.y;
  150.                   if (yOffset > 0 && views[i].getMinimumSpan(0) <= info.pageHeight) {
  151.                      views[i].move(0, yOffset, false);
  152.                      bPageAdjustmentOccurred = true;
  153.                   }
  154.                }
  155.             }
  156.  
  157.             if (!bPageAdjustmentOccurred) {
  158.                this.height = maxAboveBaseline + maxDescent;
  159.             } else {
  160.                int topX = this.field_0;
  161.                int topY = this.field_1;
  162.                int lineWidth = this.renderedWidth;
  163.                int biggestY = this.field_1;
  164.  
  165.                for(int i = 0; i < views.length; ++i) {
  166.                   biggestY = Math.max(biggestY, views[i].m_bounds.y + views[i].m_bounds.height);
  167.                }
  168.  
  169.                this.height = biggestY - topY;
  170.             }
  171.  
  172.             info.setPageBreak(this.field_1 + this.height);
  173.          } else {
  174.             this.height = maxAboveBaseline + maxDescent;
  175.          }
  176.  
  177.          this.descent = 0;
  178.          this.bounds = new Rectangle(this.field_0, this.field_1, this.renderedWidth, this.height);
  179.          info.setPageBreak(this.field_1 + this.height);
  180.          return this.bounds;
  181.       }
  182.    }
  183.  
  184.    void move(int x, int y, boolean bMoveFloaters) {
  185.       View[] views = this.getViews();
  186.  
  187.       for(int i = 0; i < views.length; ++i) {
  188.          views[i].move(x, y, bMoveFloaters);
  189.       }
  190.  
  191.       Rectangle var10000 = this.bounds;
  192.       var10000.x += x;
  193.       var10000 = this.bounds;
  194.       var10000.y += y;
  195.    }
  196.  
  197.    int pageBreakAdjust(LayoutInfo info) {
  198.       Rectangle origBounds = new Rectangle(this.bounds);
  199.       info.setPageBreak(origBounds.y);
  200.       View[] views = this.getViews();
  201.  
  202.       for(int i = 0; i < views.length; ++i) {
  203.          if (!views[i].isContainerView()) {
  204.             if (views[i].m_bounds.intersects(info.pageBreak)) {
  205.                int yOffset = info.pageBreak.y + info.pageBreak.height - views[i].m_bounds.y;
  206.                if (yOffset > 0 && views[i].getMinimumSpan(0) <= info.pageHeight) {
  207.                   views[i].move(0, yOffset, false);
  208.                }
  209.             }
  210.          } else {
  211.             views[i].pageBreakAdjust(info);
  212.          }
  213.       }
  214.  
  215.       int biggestY = origBounds.y;
  216.  
  217.       for(int i = 0; i < views.length; ++i) {
  218.          biggestY = Math.max(biggestY, views[i].m_bounds.y + views[i].m_bounds.height);
  219.       }
  220.  
  221.       this.height = biggestY - origBounds.y;
  222.       this.bounds.setBounds(origBounds.x, origBounds.y, origBounds.width, this.height);
  223.       return Math.max(0, this.bounds.height - origBounds.height);
  224.    }
  225.  
  226.    View removeLastView() {
  227.       View v = (View)this.vector.elementAt(this.vector.size() - 1);
  228.       this.vector.removeElementAt(this.vector.size() - 1);
  229.       return v;
  230.    }
  231.  
  232.    View removeView(int idx) {
  233.       View v = (View)this.vector.elementAt(idx);
  234.       this.vector.removeElementAt(idx);
  235.       return v;
  236.    }
  237. }
  238.